import axios, { type AxiosRequestConfig } from 'axios';
import { getToken } from './token';
import { type IResponse } from '@/types/response';

const server = axios.create({
  baseURL: '/api',
  timeout: 5000,
});

// 请求拦截
server.interceptors.request.use(
  (config) => {
    // 统一处理请求参数
    if (config.method?.toUpperCase() == 'GET') {
      config.params = config.data;
    }
    // 携带token
    // 获取token信息
    const token = getToken();
    // 携带标准验证信息
    config.headers.Authorization = token;
    // 根据需要，携带自定义验证信息
    config.headers['token'] = token;

    // 返回请求配置
    return config;
  },
  (err) => {
    // 输出错误信息
    console.log(err);
    // 返回错误信息，进入catch
    return Promise.reject(err);
  },
);

// 相应拦截
server.interceptors.response.use(
  ({ data }) => {
    // 对请求结果进行统一处理
    const res = data as IResponse;
    if (res.success) {
      // 返回正确信息，进入then
      return Promise.resolve(data.data);
    }
    return Promise.reject('请求失败');
  },
  (err) => {
    // 输出错误信息
    console.log(err);
    // 返回错误信息，进入catch
    return Promise.reject(err);
  },
);

/**
 * 发起网络请求
 * @param config 请求配置
 * @returns 请求结果
 */
export const http = <T>(config: AxiosRequestConfig<any>) => {
  return server.request<any, T>(config);
};
